package com.dailyblue.java.reflection;

import lombok.SneakyThrows;

import java.lang.reflect.Method;

// 反射的方法操作
public class DemoD {
    @SneakyThrows
    public static void main(String[] args) {
        // 获取类
        Class c = Class.forName("com.dailyblue.java.reflection.Student");
        // 获取对象
        Object obj = c.getDeclaredConstructor().newInstance();
        // 获取所有方法
        Method[] methods1 = c.getDeclaredMethods();
        Method[] methods2 = c.getMethods();
        for (Method m1 : methods1) {
            System.out.println(m1);
        }
        System.out.println("---------------------------------");
        for (Method m2 : methods2) {
            System.out.println(m2);
        }
        System.out.println("---------------------------------");
        // 获取单个方法 第一个参数是方法名，其后参数是形式参数列表
        Method m1 = c.getDeclaredMethod("e", String.class);
        Method m2 = c.getDeclaredMethod("f");
        Method m3 = c.getMethod("d", Integer.TYPE, String.class);
        System.out.println(m1);
        System.out.println(m2);
        System.out.println(m3);
        System.out.println("---------------------------------");
        // 操作方法 第一个参数是对象，其后参数是实际参数列表
        Object result1 = m1.invoke(obj, "admin");
        m2.setAccessible(true);
        Object result2 = m2.invoke(obj);
        Object result3 = m3.invoke(obj, 1, "张三");
        System.out.println(result1);
        System.out.println(result2);
        System.out.println(result3);
    }
}
